<!DOCTYPE html>
<!-- Copyright 2020 the V8 project authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file. -->
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Indicium</title>
  <!-- <link rel="icon" type="image/png" href="/images/favicon.png"/> -->

  <link rel="modulepreload" href="./log-file-reader.mjs" >
  <link rel="modulepreload" href="./helper.mjs" >
  <link rel="preload" href="./log-file-reader-template.html" as="fetch" crossorigin="anonymous">
  <script type="module">
    // Force instatiating the log-reader before anything else.
    import "./log-file-reader.mjs";
    // Delay loading of the main App
    (async function() {
      let module = await import('./index.mjs');
      globalThis.app = new module.App("#log-file-reader", "#map-panel", "#map-stats-panel",
        "#timeline-panel", "#ic-panel", "#map-track", "#ic-track", "#deopt-track",
        "#source-panel");
    })();
  </script>

  <link rel="stylesheet" type="text/css" href="./index.css">
  <style>
    .theme-switch-wrapper {
      display: inline-block;
      align-items: center;
    }

    .theme-switch {
      display: inline-block;
      height: 16px;
      position: relative;
      width: 38px;
    }

    .theme-switch input {
      display: none;
    }

    .slider {
      background-color: var(--primary-color);
      bottom: 0;
      cursor: pointer;
      left: 0;
      position: absolute;
      right: 0;
      top: 0;
      border-radius: 34px;
    }

    .slider:before {
      background-color: var(--surface-color);
      position: absolute;
      height: 10px;
      width: 10px;
      bottom: 3px;
      content: "";
      left: 4px;
      border-radius: 50%;
    }

    input:checked+.slider:before {
      transform: translateX(20px);
    }

    #container.initial {
      display: none;
    }

    #timeline-panel {
      width: 100%;
    }

    .panels{
      display: grid;
      align-content: center;
      grid-template-columns: repeat(auto-fill, minmax(500px, 1fr));
      grid-auto-flow: row dense;
      grid-gap: 10px;
      margin-top: 10px;
    }

    dt::after  {
      content: ":";
    }
  </style>
</head>

<body>
  <section id="file-reader">
    <log-file-reader id="log-file-reader"></log-file-reader>
  </section>

  <section id="container" class="initial">
    <timeline-panel id="timeline-panel">
      <timeline-track id="map-track"></timeline-track>
      <timeline-track id="ic-track"></timeline-track>
      <timeline-track id="deopt-track"></timeline-track>
    </timeline-panel>
    <div class="panels">
      <map-panel id="map-panel"></map-panel>
      <stats-panel id="map-stats-panel"></stats-panel>
      <ic-panel id="ic-panel" onchange="app.handleSelectIc(event)"></ic-panel>
      <source-panel id="source-panel"></source-panel>
    </div>
  </section>

  <div class="panels">
    <section id="settings" class="panel">
      <h2>Settings</h2>
      <span>Theme:</span>
      <div class="theme-switch-wrapper">
        <label class="theme-switch" for="theme-switch-input">
          <input type="checkbox" id="theme-switch-input" />
          <div class="slider"></div>
        </label>
      </div>
    </section>

    <section id="instructions" class="panel">
      <h2>Instructions</h2>
      <p>
        Unified web interface to analyse runtime information stored in the v8 log.
      </p>
      For generating a v8.log file from <a href="https://v8.dev/docs/build">d8</a>:
      <ul>
        <li>
          <code>/path/do/d8 --trace-maps --trace_ic --log-source-code $FILE</code>
        </li>
      </ul>
      For generating a v8.log file from Chrome:
      <ul>
        <li>
          <code>/path/to/chrome --user-data-dir=/var/tmp/chr$RANDOM --no-sandbox
          --js-flags='--trace-ic --trace-maps --log-source-code’
          $WEBSITE_URL</code>
        </li>
      </ul>

      <h3>Log Options:</h3>
      <dl class="d8-options">
        <dt><code>--trace-maps</code></dt>
        <dd>Log<a href="https://v8.dev/blog/fast-properties" target="_blank">
            Maps</a></dd>
        <dt><code>--trace-ic</code></dt>
        <dd>Log
          <a href="https://mathiasbynens.be/notes/shapes-ics" target="_blank">
            ICs</a></dd>
        <dt><code>--log-source-code</code></dt>
        <dd>Log source code</dd>
      </dl>

      <h3>Keyboard Shortcuts for Navigation</h3>
      <dl>
        <dt><kbd>SHIFT</kbd> + <kbd>Arrow Up</kbd></dt>
        <dd>Follow Map transition forward (first child)</dd>

        <dt><kbd>SHIFT</kbd> + <kbd>Arrow Down</kbd></dt>
        <dd>Follow Map transition backwards</dd>

        <dt><kbd>Arrow Up</kbd></dt>
        <dd>Go to previous Map chunk</dd>

        <dt><kbd>Arrow Down</kbd></dt>
        <dd>Go to next Map in chunk</dd>

        <dt><kbd>Arrow Left</kbd></dt>
        <dd>Go to previous chunk</dd>

        <dt><kbd>Arrow Right</kbd></dt>
        <dd>Go to next chunk</dd>

        <dt><kbd>+</kbd></dt>
        <dd>Timeline zoom in</dd>

        <dt><kbd>-</kbd></dt>
        <dd>Timeline zoom out</dd>
      </dl>
    </section>
  </div>
</body>
</html>
